"""
示例 1: 读取现有的 PA 文件

演示如何：
1. 读取 PA 文件
2. 显示文件头信息
3. 读取特定点的电位值
4. 遍历电极点
"""

import sys
import os

# 添加项目根目录到路径
project_root = os.path.dirname(os.path.dirname(os.path.dirname(os.path.abspath(__file__))))
sys.path.insert(0, project_root)

from SIMION.PA import PA


def read_pa_file(filename):
    """读取并分析 PA 文件"""
    print(f"\n{'='*60}")
    print(f"读取 PA 文件: {filename}")
    print(f"{'='*60}\n")
    
    try:
        # 读取 PA 文件
        pa = PA(file=filename)
        
        # 显示文件头信息
        print("文件头信息:")
        print("-" * 60)
        print(pa.header_string())
        print("-" * 60)
        
        # 显示维度信息
        print(f"\n阵列维度:")
        print(f"  X 方向: {pa.nx()} 网格点")
        print(f"  Y 方向: {pa.ny()} 网格点")
        print(f"  Z 方向: {pa.nz()} 网格点")
        print(f"  总网格点数: {pa.nx() * pa.ny() * pa.nz()}")
        
        # 显示其他信息
        print(f"\n其他参数:")
        print(f"  对称类型: {pa.symmetry()}")
        print(f"  场类型: {pa.field_type()}")
        print(f"  最大电压: {pa.max_voltage()} V")
        print(f"  镜像设置: X={pa.mirror_x()}, Y={pa.mirror_y()}, Z={pa.mirror_z()}")
        
        # 读取中心点的电位
        print(f"\n中心点电位:")
        cx, cy, cz = pa.nx() // 2, pa.ny() // 2, pa.nz() // 2
        is_electrode, potential = pa.point(cx, cy, cz)  # 注意：返回顺序是 (is_electrode, potential)
        print(f"  坐标: ({cx}, {cy}, {cz})")
        print(f"  电位: {potential} V")
        print(f"  是否为电极: {'是' if is_electrode else '否'}")
        
        # 统计电极点数量
        print(f"\n统计电极点...")
        electrode_count = 0
        sample_electrodes = []
        
        for z in range(pa.nz()):
            if z % 100 == 0:  # 每 100 层显示进度
                print(f"  处理进度: {z}/{pa.nz()} (Z层)")
            for y in range(pa.ny()):
                for x in range(pa.nx()):
                    is_elec, pot = pa.point(x, y, z)  # 返回顺序是 (is_electrode, potential)
                    if is_elec:
                        electrode_count += 1
                        if len(sample_electrodes) < 5:
                            sample_electrodes.append((x, y, z, pot))
        
        print(f"  电极点总数: {electrode_count}")
        print(f"  电极占比: {electrode_count / (pa.nx() * pa.ny() * pa.nz()) * 100:.2f}%")
        
        if sample_electrodes:
            print(f"\n  前 {len(sample_electrodes)} 个电极点示例:")
            for x, y, z, pot in sample_electrodes:
                print(f"    ({x}, {y}, {z}): {pot} V")
        
        print(f"\n{'='*60}")
        print("读取完成!")
        print(f"{'='*60}\n")
        
    except Exception as e:
        print(f"\n错误: {e}")
        print("\n提示: 请确保文件路径正确，且文件格式为 PA 或 PA#")


if __name__ == "__main__":
    # 使用示例
    print("\n" + "="*60)
    print("SIMION PA 文件读取示例")
    print("="*60)
    
    # 示例 1: 如果你有 SIMION 的示例文件，可以这样读取
    # 注意：Windows 路径需要使用 r"路径" 前缀（原始字符串）或正斜杠
    # read_pa_file("D:/SIMION-2024/examples/quad/quad.pa#")
    #read_pa_file(r"C:\Users\Administrator\Desktop\test\後期\simion\160x320\160x320.pa#")
    
    print("\n使用方法:")
    print("1. 修改下面的文件路径为你的 PA 文件路径")
    print("2. 取消注释并运行")
    print("\n示例代码:")
    print('  read_pa_file("你的文件路径.pa#")')
    
    # 如果提供了命令行参数
    if len(sys.argv) > 1:
        read_pa_file(sys.argv[1])
    else:
        print("\n或者通过命令行参数提供文件路径:")
        print(f"  python {os.path.basename(__file__)} 文件路径.pa#")

